﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ConcordWinManager
{
    public partial class OplataForm : Form
    {
        Oplata oplata;
        
        /// <summary>
        /// МАксимальная сумма платежа
        /// </summary>
        decimal max;

        public OplataForm()
        {
            InitializeComponent();
        }

        public OplataForm(Oplata oplata, decimal max)
        {
            InitializeComponent();

            this.oplata = oplata;
            this.max = max;

            lblMax.Text = string.Format("(Максимум {0} руб.)", max);
            tbxDefinition.Text = oplata.Definition;            
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tbxSummPre_TextChanged(object sender, EventArgs e)
        {
            try
            {
                this.oplata.Summ = Convert.ToDecimal(tbxSumm.Text.Trim());
                tbxSummProp.Text = RSDN.RusCurrency.Str(Convert.ToDouble(this.oplata.Summ), "RUR");
                tbxOstatok.Text = (max - this.oplata.Summ).ToString();
                this.oplata.DateOplata = DateTime.Now;
            }
            catch
            {
                MessageBox.Show("Входная строка имеет неверный формат", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            try
            {           
                if(!(oplata.template_check.id_template != 0))
                {
                    MessageBox.Show("Не все обязательные для заполнения поля заполнены", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (decimal.TryParse(tbxSumm.Text.Trim(), out this.oplata.Summ))
                {
                    if (this.oplata.Summ > 0 && this.oplata.Summ <= this.max)
                    {
                        Tools.RunWithProgressIndicator(this, delegate { this.oplata.Insert(); });
                    }
                    else
                    {
                        MessageBox.Show(String.Format("Сумма оплаты должна быть больше 0 руб. и не должна превышать остаток {0} руб.", this.max),
                            "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                }

                MessageBox.Show("Оплата внесена успешно", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

                GenerateDocument();                                

                this.Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show("Не удалось внести оплату\n\n Ошибка:" + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        Microsoft.Office.Interop.Word.Application wrd;

        public void GenerateDocument()
        {
            List<string> liKeyWordsFrom = new List<string>();
            List<string> liKeyWordsTo = new List<string>();
            
            liKeyWordsFrom.Add("[номер_договора]"); liKeyWordsTo.Add(oplata.contract.ContractNumber);

            //liKeyWordsFrom.Add("[дд]"); liKeyWordsTo.Add(DateTime.Parse(oplata.contract.DateZakl).Day.ToString("0#"));
            //liKeyWordsFrom.Add("[мм]"); liKeyWordsTo.Add(DateTime.Parse(oplata.contract.DateZakl).Month.ToString("0#"));
            //liKeyWordsFrom.Add("[гггг]"); liKeyWordsTo.Add(DateTime.Parse(oplata.contract.DateZakl).Year.ToString());
            liKeyWordsFrom.Add("[дд]"); liKeyWordsTo.Add(DateTime.Now.Day.ToString("0#"));
            liKeyWordsFrom.Add("[мм]"); liKeyWordsTo.Add(DateTime.Now.Month.ToString("0#"));
            liKeyWordsFrom.Add("[гггг]"); liKeyWordsTo.Add(DateTime.Now.Year.ToString());

            liKeyWordsFrom.Add("[номер_квитанции]"); liKeyWordsTo.Add(oplata.OplataNum);
            liKeyWordsFrom.Add("[основание_оплаты]"); liKeyWordsTo.Add(oplata.Definition);
            liKeyWordsFrom.Add("[конт_фамилия]"); liKeyWordsTo.Add(oplata.contract.contragent.Family);
            liKeyWordsFrom.Add("[конт_имя]"); liKeyWordsTo.Add(oplata.contract.contragent.Name);
            liKeyWordsFrom.Add("[конт_отчество]"); liKeyWordsTo.Add(oplata.contract.contragent.FName);
            liKeyWordsFrom.Add("[конт_адрес]"); liKeyWordsTo.Add(oplata.contract.contragent.address.RebuildAddressText());
            liKeyWordsFrom.Add("[конт_паспорт_серия]"); liKeyWordsTo.Add(oplata.contract.contragent.PassportSeries);
            liKeyWordsFrom.Add("[конт_паспорт_номер]"); liKeyWordsTo.Add(oplata.contract.contragent.PassportNumber);
            liKeyWordsFrom.Add("[сумма_договора]"); liKeyWordsTo.Add(oplata.contract.SummItog.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[стоимость_работ]"); liKeyWordsTo.Add(oplata.contract.SummWork.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[аванс]"); liKeyWordsTo.Add(oplata.contract.Advance.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[сумма_оплата_число]"); liKeyWordsTo.Add(oplata.Summ.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[сумма_оплата_прописью]"); liKeyWordsTo.Add(tbxSummProp.Text);
            liKeyWordsFrom.Add("$_____________________"); liKeyWordsTo.Add("Ы");
            liKeyWordsFrom.Add("[резидент_название]"); liKeyWordsTo.Add(oplata.contract.rezident.Name2);
            liKeyWordsFrom.Add("[резидент_реквизиты]"); liKeyWordsTo.Add(oplata.contract.rezident.Details);

            liKeyWordsFrom.Add("[конс_фамилия]"); liKeyWordsTo.Add(Settings.consultant.Family);
            liKeyWordsFrom.Add("[конс_имя]"); liKeyWordsTo.Add(Settings.consultant.Name);
            liKeyWordsFrom.Add("[конс_отчество]"); liKeyWordsTo.Add(Settings.consultant.FName);

            wrd = new Microsoft.Office.Interop.Word.Application();

            Tools.RunWithProgressIndicator(this, delegate
            {                
                oplata.template_check.GenerateDocument(null, liKeyWordsFrom, liKeyWordsTo, ref wrd, oplata.contract.ContractNumber + "op");
            });

        }

        private void tbxSumm_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (
                !char.IsDigit(e.KeyChar) &&
                !char.IsControl(e.KeyChar) &&
                !((e.KeyChar == ',') &&
                !((TextBox)sender).Text.Contains(','))
                )
            {
                e.Handled = true;
            }
        }

        private void btnCheckChange_Click(object sender, EventArgs e)
        {
            TemplateForm templateForm = new TemplateForm(this, "к");
            templateForm.ShowDialog();

            if (templateForm.template.id_template != 0)
            {
                oplata.template_check = templateForm.template;

                tbxCheckText.Text = oplata.template_check.Name;
            }
        }

        public void ViewOplata(int id_oplata)
        {
            Oplata oplata = new Oplata();
            oplata.SelectById(id_oplata);


            List<string> liKeyWordsFrom = new List<string>();
            List<string> liKeyWordsTo = new List<string>();

            liKeyWordsFrom.Add("[номер_договора]"); liKeyWordsTo.Add(oplata.contract.ContractNumber);
                        
            liKeyWordsFrom.Add("[дд]"); liKeyWordsTo.Add(oplata.DateOplata.Day.ToString("0#"));
            liKeyWordsFrom.Add("[мм]"); liKeyWordsTo.Add(oplata.DateOplata.Month.ToString("0#"));
            liKeyWordsFrom.Add("[гггг]"); liKeyWordsTo.Add(oplata.DateOplata.Year.ToString());

            liKeyWordsFrom.Add("[номер_квитанции]"); liKeyWordsTo.Add(oplata.OplataNum);
            liKeyWordsFrom.Add("[основание_оплаты]"); liKeyWordsTo.Add(oplata.Definition);
            liKeyWordsFrom.Add("[конт_фамилия]"); liKeyWordsTo.Add(oplata.contract.contragent.Family);
            liKeyWordsFrom.Add("[конт_имя]"); liKeyWordsTo.Add(oplata.contract.contragent.Name);
            liKeyWordsFrom.Add("[конт_отчество]"); liKeyWordsTo.Add(oplata.contract.contragent.FName);
            liKeyWordsFrom.Add("[конт_адрес]"); liKeyWordsTo.Add(oplata.contract.contragent.address.RebuildAddressText());
            liKeyWordsFrom.Add("[конт_паспорт_серия]"); liKeyWordsTo.Add(oplata.contract.contragent.PassportSeries);
            liKeyWordsFrom.Add("[конт_паспорт_номер]"); liKeyWordsTo.Add(oplata.contract.contragent.PassportNumber);
            liKeyWordsFrom.Add("[сумма_договора]"); liKeyWordsTo.Add(oplata.contract.SummItog.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[стоимость_работ]"); liKeyWordsTo.Add(oplata.contract.SummWork.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[аванс]"); liKeyWordsTo.Add(oplata.contract.Advance.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[сумма_оплата_число]"); liKeyWordsTo.Add(oplata.Summ.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[сумма_оплата_прописью]"); liKeyWordsTo.Add(RSDN.RusCurrency.Str(Convert.ToDouble(oplata.Summ), "RUR"));
            liKeyWordsFrom.Add("$_____________________"); liKeyWordsTo.Add("Ы");
            liKeyWordsFrom.Add("[резидент_название]"); liKeyWordsTo.Add(oplata.contract.rezident.Name2);
            liKeyWordsFrom.Add("[резидент_реквизиты]"); liKeyWordsTo.Add(oplata.contract.rezident.Details);

            liKeyWordsFrom.Add("[конс_фамилия]"); liKeyWordsTo.Add(oplata.consultant.Family);
            liKeyWordsFrom.Add("[конс_имя]"); liKeyWordsTo.Add(oplata.consultant.Name);
            liKeyWordsFrom.Add("[конс_отчество]"); liKeyWordsTo.Add(oplata.consultant.FName);

            wrd = new Microsoft.Office.Interop.Word.Application();

            Tools.RunWithProgressIndicator(this, delegate
            {
                oplata.template_check.GenerateDocument(null, liKeyWordsFrom, liKeyWordsTo, ref wrd, oplata.contract.ContractNumber + "op");
            });
        }
    }
}